package MyFramePro.MyJob;


import MyFramePro.Domain.Entity.Article;
import MyFramePro.Service.Impl.ArticleServiceImpl;
import MyFramePro.Utils.RedisCache;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 这里为定时任务，每隔 XX分钟 把 ”Redis中的浏览量“ 更新到 ”数据库“ 中
 */
@Component
public class UpdateViewCountJop {

    @Resource
    private RedisCache redisCache;

    @Resource
    private ArticleServiceImpl articleService;


    @Scheduled(cron = "* 0/10 * * * ?")  //这里表示每隔两分钟更新一次
    public void updateViewCount(){

        //1.获取 redis 中浏览量
        Map<String, Integer> viewCountMap = redisCache.getCacheMap("article:viewCount");  //这里获取到 hash 中的 key 和 value
        Set<Map.Entry<String, Integer>> entrySet = viewCountMap.entrySet(); //先使用 entrySet() 转换为 Set 集合类型，才能调用 stream 流

        List<Article> articles = entrySet.stream()
                .map(entry ->
                     new Article(Long.valueOf(entry.getKey()), entry.getValue().longValue())  //传入 id 和 viewCount
                )
                .collect(Collectors.toList());

        //2.将 redis 中的浏览量更新到数据库中
//        articleService.updateBatchById(articles);   //文章的 id 不止一个， where id in ....
        for (Article article:articles){
            LambdaUpdateWrapper<Article> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper.eq(Article::getId,article.getId());
            updateWrapper.set(Article::getViewCount,article.getViewCount());
            articleService.update(updateWrapper);
        }

    }

}
